Insert new interval (merge if necessary)

Time: O(N); Space: O(1); hard

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:

Input: intervals: [1, 3], [6, 9]; newInterval: [2, 5]

Output: [[1, 5], [6, 9]]

Example 2:

Input: intervals: [1, 2], [3, 5], [6, 7], [8, 10], [12, 16]; newInterval: [4, 9]

Output: [[1, 2], [3, 10], [12, 16]]

Explanation:

  • This is because the newInterval [4, 9] overlaps with [3, 5], [6, 7], [8, 10].

[9]:
# Definition for an interval.
class Interval:
    def __init__(self, start = 0, end = 0):
        self.start = start
        self.end = end

    def __repr__(self):
        return "[{}, {}]".format(self.start, self.end)

class Solution1(object):
    def insert(self, intervals, newInterval) -> list:
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        result = []
        i = 0
        while i < len(intervals) and newInterval.start > intervals[i].end:
            result += intervals[i],
            i += 1

        while i < len(intervals) and newInterval.end >= intervals[i].start:
            newInterval = Interval(min(newInterval.start, intervals[i].start), \
                                   max(newInterval.end, intervals[i].end))
            i += 1

        result += newInterval,         # add set -> comma
        result += intervals[i:]

        return result
[11]:
s = Solution1()
intervals = [Interval(1, 3), Interval(6, 9)]
newInterval = Interval(2, 5)
list_of_intervals = s.insert(intervals, newInterval)
res = []
for ivl in list_of_intervals:
    res.append([ivl.start, ivl.end])
assert res == [[1, 5], [6, 9]]

intervals = [Interval(1, 2), Interval(3, 5), Interval(6, 7), Interval(8, 10), Interval(12, 16)]
newInterval = Interval(4, 9)
list_of_intervals = s.insert(intervals, newInterval)
res = []
for ivl in list_of_intervals:
    res.append([ivl.start, ivl.end])
assert res == [[1, 2], [3, 10], [12, 16]]